﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ArmaTuCumple.Model.Repository
{

    public interface  IRepositorioFinal<T> where T:class
    {
        /// <summary>
        /// Obtiene todos los datos del tipo
        /// </summary>
        /// <returns></returns>
        IEnumerable<T> All();

        /// <summary>
        /// Obtiene todos los datos que coinciden con la expresion
        /// </summary>
        /// <param name="exp"></param>
        /// <returns></returns>
        IEnumerable<T> FindAll(Func<T, bool> exp);

        /// <summary>
        /// Obtiene la entidad unica que coincide con la expresion
        /// </summary>
        /// <param name="exp"></param>
        /// <returns></returns>
        T Single(Func<T, bool> exp);

        /// <summary>
        /// Obtiene el primer elemento que satisface la condicion
        /// </summary>
        /// <param name="exp"></param>
        /// <returns></returns>
        T First(Func<T, bool> exp);

        /// <summary>
        /// Marcar la entidad que sera eliminada cuando se envien los cambios
        /// </summary>
        /// <param name="entity"></param>
        void DeleteOnSubmit(T entity);

        /// <summary>
        /// Marca la entidad para que sea agregada cuando se envien los cambios
        /// </summary>
        /// <param name="entity"></param>
        void InsertOnSubmit(T entity);

        /// <summary>
        /// Guarda los cambios en el DataContext
        /// </summary>
        void SubmitChanges();


    }
}
